


// typeof 验证类型

/**
 * 1. typeof null === 'object' // JavaScript 诞生以来便如此
 * 2. 除 Function 外的所有构造函数的类型都是 'object'
 * 
 */

// console.log(typeof 1) // number
// console.log(typeof '1') // string
// console.log(typeof BigInt(1)) // bigint
// console.log(typeof Symbol('1')) // symbol
// console.log(typeof undefined) // undefined
// console.log(typeof function(){}) // function
// console.log(typeof true) // boolean
// console.log(typeof null) // object
// console.log(typeof /d/) // object
// console.log(typeof new RegExp) // object
// console.log(typeof []) // object
// console.log(typeof {}) // object
// console.log(typeof new Date) // object



// instanceof 检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上

/**
 *  instanceof 就是会在__proto__链上一直找，不断往上找这个属性，找到就返回true
 */

// var arr = [1, 2, 3, 4];

// console.log(arr instanceof Array); // true

// console.log(arr instanceof Object); // true

// console.log(arr.__proto__ === Array.prototype); // true
// console.log(arr.__proto__ === Object.prototype); // false

// console.log(arr.__proto__.__proto__ === Object.prototype); // true

// Object.prototype 已经是最顶层了，没有 __proto__






class Test {}

const test = new Test();

console.log(test instanceof Test);


// ------------------------------------------

// 实现 instanceof

function instanceOf(target, type) {
  // 先拿到type 的原型 以及 target的原型属性
  type = type.prototype;
  target = target.__proto__;

  while(true) {
    if (target === null)
      return false;
    
    if (target === type)
      return true;

    target = target.__proto__;
  }
}

console.log(instanceOf(test, Test));

console.log(instanceOf([], Array));

console.log(instanceOf([], Object));
